﻿using System.Threading;
using System.Threading.Tasks;
using Engine;
using Game;
using Game.Server;

namespace YS
{
    public class MinorCommand : AbstractProcessCmd
    {
        public MinorCommand()
        {
           // Log.Information("[DEBUG] MinorCommand 已被主程序加载！");
        }
        public string YSTip = "\n/ys time  -查看时间\n/ys set(1/2/3)  -保存坐标\n/ys read(1/2/3)  -查看保存坐标\n/ys go(1/2/3)  -传送自定义坐标\n/ys to(1/2/3)  -定点传送\n/ys place  -随机传送\n";
        // 定义用于存储消息的字符串变量
        public string message = "";
        private YS_zdyTP YS_ZdyTP = new YS_zdyTP(); // 自定义保存坐标传送点功能  
        private YStime YStime = new YStime(); // 查看时间功能
        private IsOverSec cheakSec = new IsOverSec(); // 定点传送冷却时间功能
        private YSplaceTime cheakSec2 = new YSplaceTime(); // 随机传送冷却时间功能
        // 定义是否无敌的标记
        public bool WuDiOver;
        // 定义是否随机传送无敌的标记
        public bool WuDiOver2;      
        // 定义用于存储玩家GUID的字符串变量
        public string text = "";
        // 定义Cmd属性，返回命令名称
        public override string Cmd => "ys";
        // 定义Introduce属性，返回命令的介绍信息
        public override string Introduce => "/ys    -查看微功能相关的命令帮助";
        // 定义AuthLevel属性，返回命令的权限等级
        public override int AuthLevel => 0;
        // 定义Display属性，返回命令的显示类型
        public override DisplayType Display => DisplayType.All;
        // 发送帮助信息的方法
        private void SendHelpMessage()
        {
            message = YSTip; // 将帮助信息赋值给message变量
            SendMessage("ys", message); // 发送帮助信息
        }

        // 处理命令的方法
        public override void ProcessCmd()
        {
            // 检查游戏是否已启动
            if (GameManager.Project == null)
            {
                SendMessage("ys", "你需要先开始游戏"); // 如果未启动，发送提示信息
                return;
            }

            // 检查是否为终端模式
            if (m_isTerminal)
            {
                SendMessage("ys", "\n======控制台不能使用======\n==== ys 传送指令大全 ====" + YSTip + "\n========================="); // 如果是终端模式，发送提示信息
                return;
            }

            // 获取玩家对象
            ComponentPlayer componentPlayer = m_client.PlayerData.ComponentPlayer;

            //无敌冷却时间
            WuDiOver = cheakSec.Check(componentPlayer);
            WuDiOver2 = cheakSec2.CheckCoolDown(componentPlayer);

            // 根据命令参数执行不同的操作
            if (m_messageDatas.Length < 2)
            {
                SendHelpMessage(); // 如果参数不足，发送帮助信息
            }
            else if (m_messageDatas[1] == "time" && m_messageDatas.Length == 2)
            {
                SendMessage("gps", YStime.YS_time()); // 查看时间
            }
            else if (m_messageDatas[1] == "set")
            {
                string text2 = YS_ZdyTP.YS_set(componentPlayer, m_messageDatas); // 保存坐标
                SendMessage("ys", text2);
            }
            else if (m_messageDatas[1] == "read")
            {
                string text3 = YS_ZdyTP.YS_read_go(componentPlayer, m_messageDatas, 1, WuDiOver); // 查看保存坐标
                SendMessage("ys", text3);
            }
            else if (m_messageDatas[1] == "go")
            {
                string text4 = YS_ZdyTP.YS_read_go(componentPlayer, m_messageDatas, 0, WuDiOver); // 传送自定义坐标
                SendMessage("ys", text4);
            }
            else if (m_messageDatas[1] == "to")
            {
                bool isAdmin = m_client.PlayerData.ServerManager;
                var ysto = new YSTo(componentPlayer, isAdmin);

                string result = ysto.ExecuteCommand(m_messageDatas, WuDiOver);
                SendMessage("ys", result);

                // 触发无敌保护
                if (result.Contains("WuDiOver"))
                {
                    _ = lockHealBuff();
                }
            }
            else if (m_messageDatas[1] == "place")
            {
                bool isAdmin = m_client.PlayerData.ServerManager;
                // 传入触发无敌的回调
                var yssj = new YSplace(componentPlayer, isAdmin, () => _ = lockHealBuff());

                string text = yssj.ExecuteCommand2(m_messageDatas, WuDiOver2, m_client);
                SendMessage("ys", text);
                // 触发无敌保护
                if (text.Contains("WuDiOver2") && !isAdmin)
                {
                    _ = lockHealBuff();
                }
            }
            else
            {
                SendHelpMessage(); // 如果命令不匹配，发送帮助信息
            }
        }
        // 异步锁定和解锁玩家的无敌状态
        private CancellationTokenSource _cancellationTokenSource; // 用于取消之前的计时器任务

        public async Task lockHealBuff()
        {
            _ = m_client.PlayerData.ComponentPlayer; // 获取玩家对象
            cheakSec.Reboot(m_client.PlayerData.ComponentPlayer); // 重置秒间隔检查

            // 如果之前的计时器仍在运行，取消它
            _cancellationTokenSource?.Cancel();

            // 创建一个新的 CancellationTokenSource
            _cancellationTokenSource = new CancellationTokenSource();

            // 启动新的计时器任务
            await Task.Delay(100); // 延迟100毫秒
            lockheal(isLocked: true); // 锁定玩家的无敌状态

            try
            {
                // 等待20秒，或者直到 CancellationToken 被取消
                await Task.Delay(20000, _cancellationTokenSource.Token);
            }
            catch (TaskCanceledException)
            {
                // 如果任务被取消，不执行解锁操作
                return;
            }

            // 20秒后解锁玩家的无敌状态
            lockheal(isLocked: false);
        }

        // 锁定或解锁玩家的无敌状态
        public void lockheal(bool isLocked)
        {
            GameManager.Project.FindSubsystem<SubsystemPlayers>(); 
            var player = m_client.PlayerData.ComponentPlayer; // 获取玩家对象
            if (player != null)
            {
                player.ComponentHealth.IsInvulnerable = isLocked; // 设置玩家的无敌状态
                string text = (isLocked ? "已经<c=green>开启 20 S </c>" : "已经<c=red>结束</c>") + "无敌模式"; // 构建提示信息
                SendMessage("系统", text); // 发送提示信息
            }
            else
            {
                SendMessage("系统", "玩家对象未初始化");
            }
        }

    }
}